home *** CD-ROM | disk | FTP | other *** search
/ System Booster / System Booster.iso / Commodities / ClipTool / src / handleevents.c < prev    next >
C/C++ Source or Header  |  1996-09-26  |  12KB  |  427 lines

  1. /*
  2.  *  ClipTool (Udklipsværktøj) - A Commodities Exchange Application
  3.  *  Copyright (C) 1994 Torsten Poulin
  4.  *
  5.  *  handleevents.c
  6.  *
  7.  *  This program is free software; you can redistribute it and/or modify
  8.  *  it under the terms of the GNU General Public License as published by
  9.  *  the Free Software Foundation; either version 2 of the License, or
  10.  *  (at your option) any later version.
  11.  *
  12.  *  This program is distributed in the hope that it will be useful,
  13.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  14.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15.  *  GNU General Public License for more details.
  16.  *
  17.  *  You should have received a copy of the GNU General Public License
  18.  *  along with this program; if not, write to the Free Software
  19.  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  20.  *
  21.  *             The author can be contacted by mail at
  22.  *               Torsten Poulin
  23.  *               Banebrinken 99, 2, 77
  24.  *               DK-2400 Copenhagen NV
  25.  *               Denmark
  26.  *             or via email: torsten@diku.dk
  27.  *
  28.  * $Log:    handleevents.c,v $
  29.  * Revision 1.1  94/02/20  21:32:26  Torsten
  30.  * Initial revision
  31.  * 
  32.  */
  33.  
  34. static char const RCSid[] = "$Id: handleevents.c,v 1.1 94/02/20 21:32:26 Torsten Exp $";
  35.  
  36. #include "cliptool.h"
  37.  
  38. static BOOL handleIntui(void);
  39. static BOOL handleCX(void);
  40. static void handleAppWin(void);
  41. static void handleAppIcon(void);
  42. static BOOL handleARexx(void);
  43. static long rxcmd(long, UBYTE *, struct CSource *, struct RexxMsg *);
  44.  
  45. void handleevents(void)
  46. {
  47.   BOOL killed = FALSE;
  48.   ULONG sigrcvd, winsigflag, flags;
  49.  
  50.   /* Should the window be opened initially? */
  51.   if (nothidden)
  52.     if (!opengui()) closegui();
  53.  
  54.   while (!killed) {
  55.     winsigflag = 0;
  56.  
  57.     ghosting();
  58.  
  59.     flags = SIGBREAKF_CTRL_C | SIGBREAKF_CTRL_F | cxsigflag | rxsigflag;
  60.     if (guiwin) {
  61.       flags |= winsigflag = 1L << guiwin->UserPort->mp_SigBit;
  62.       if (appwin)
  63.     flags |= awsigflag;
  64.     }
  65.     if (appicon) flags |= aisigflag;
  66.  
  67.     sigrcvd = Wait(flags);
  68.  
  69.     if (guiwin) {
  70.       if (appwin)
  71.     if (sigrcvd & awsigflag) handleAppWin();
  72.       if (sigrcvd & winsigflag) killed = handleIntui();
  73.     }
  74.     if (sigrcvd & cxsigflag) killed = handleCX();
  75.     if (appicon && (sigrcvd & aisigflag)) handleAppIcon();
  76.     if (sigrcvd & rxsigflag) killed = handleARexx();
  77.     if (sigrcvd & SIGBREAKF_CTRL_F)
  78.       if(!opengui()) closegui();
  79.     if (sigrcvd & SIGBREAKF_CTRL_C) killed = TRUE; /* bye ... */
  80.   }
  81. }
  82.  
  83.  
  84. static BOOL handleIntui(void)
  85. {
  86.   struct IntuiMessage *gtimsg;
  87.   ULONG gtimsgclass;
  88.   UWORD gtimsgcode;
  89.   UWORD menunumber;
  90.   ULONG menuselection;
  91.   struct MenuItem *menuitem;
  92.   struct Gadget *button;
  93.   BOOL disappear = FALSE;
  94.   BOOL killed = FALSE;
  95.  
  96.   while (!killed && !disappear && (gtimsg = GT_GetIMsg(guiwin->UserPort))) {
  97.     gtimsgclass = gtimsg->Class;
  98.     gtimsgcode = gtimsg->Code;
  99.     button = (struct Gadget *) gtimsg->IAddress;
  100.     GT_ReplyIMsg(gtimsg);
  101.  
  102.     switch (gtimsgclass) {
  103.     case IDCMP_REFRESHWINDOW:
  104.       GT_BeginRefresh(guiwin);
  105.       GT_EndRefresh(guiwin, TRUE);
  106.       if (!newsize()) disappear = TRUE;
  107.       else showtext();
  108.       break;
  109.     case IDCMP_MENUPICK:
  110.       menunumber = gtimsgcode;
  111.       while (!killed && !disappear && menunumber != MENUNULL) {
  112.     menuitem = ItemAddress(ctmenustrip, menunumber);
  113.     menuselection = (ULONG) GTMENUITEM_USERDATA(menuitem);
  114.     switch (menuselection) {
  115.     case CTM_OPENTEXT: loadtext(FALSE); break;
  116.     case CTM_OPENFTXT: loadtext(TRUE); break;
  117.     case CTM_SAVETEXT: savetext(FALSE); break;
  118.     case CTM_SAVEFTXT: savetext(TRUE); break;
  119.     case CTM_ABOUT: about(); break;
  120.     case CTM_HIDE: disappear = TRUE; break;
  121.     case CTM_QUIT: killed = TRUE; break;
  122.     case CTM_CUT: cut(); break;
  123.     case CTM_COPY: copy(); break;
  124.     case CTM_PASTE: paste(); break;
  125.     case CTM_KILL: freetext(); break;
  126.     case CTM_PREV: prevtext(); break;
  127.     case CTM_NEXT: nexttext(); break;
  128.     case CTM_ICONS: createicons = (menuitem->Flags & CHECKED); break;
  129.     case CTM_APPICON: usedropicon = (menuitem->Flags & CHECKED); break;
  130.     case CTM_UNIT: getunitnumber(); break;
  131.     }
  132.     menunumber = menuitem->NextSelect;
  133.       }
  134.       break;
  135.     case IDCMP_GADGETUP:
  136.       switch (button->GadgetID) {
  137.       case BBGD_OPEN: loadtext(FALSE); break;
  138.       case BBGD_SAVE: savetext(FALSE); break;
  139.       case BBGD_CUT: cut(); break;
  140.       case BBGD_COPY: copy(); break;
  141.       case BBGD_PASTE: paste(); break;
  142.       case BBGD_KILL: freetext(); break;
  143.       case BBGD_PREV: prevtext(); break;
  144.       case BBGD_NEXT: nexttext(); break;
  145.       }
  146.       break;
  147.     case IDCMP_CLOSEWINDOW: disappear = TRUE; break;
  148.     }
  149.   }
  150.  
  151.   if (usedropicon) {
  152.     if (!appicon) opendropicon();
  153.   }
  154.   else closedropicon();
  155.   if (disappear) closegui();
  156.   return killed;
  157. }
  158.  
  159.  
  160. /*
  161.  * Handle Commodities Exchange events
  162.  */
  163.  
  164. static BOOL handleCX(void)
  165. {
  166.   CxObj *cxmsg;
  167.   ULONG cxmsgid, cxmsgtype;
  168.   BOOL killed = FALSE;
  169.  
  170.   while (cxmsg = (CxMsg *) GetMsg(broker_mp)) {
  171.     cxmsgid = CxMsgID(cxmsg);
  172.     cxmsgtype = CxMsgType(cxmsg);
  173.     ReplyMsg((struct Message *) cxmsg);
  174.  
  175.     switch (cxmsgtype) {
  176.     case CXM_IEVENT:
  177.       if (cxmsgid == EVENT_HOTKEY)
  178.     if (!opengui()) closegui();
  179.       break;
  180.     case CXM_COMMAND:
  181.       switch (cxmsgid) {
  182.       case CXCMD_DISABLE: ActivateCxObj(broker, 0L); break;
  183.       case CXCMD_ENABLE: ActivateCxObj(broker, 1L); break;
  184.       case CXCMD_APPEAR: if (!opengui()) closegui(); break;
  185.       case CXCMD_DISAPPEAR: closegui(); break;
  186.       case CXCMD_KILL: killed = TRUE; break; /* goodbye ... */
  187.       case CXCMD_UNIQUE: if (!opengui()) closegui(); break;
  188.       }
  189.       break;
  190.     }
  191.   }
  192.   return killed;
  193. }
  194.  
  195.  
  196. /*
  197.  * Handle AppWindow events.
  198.  */
  199.  
  200. static void handleAppWin(void)
  201. {
  202.   struct AppMessage *awmsg;
  203.   struct WBArg *args;
  204.   long i;
  205.  
  206.   while (awmsg = (struct AppMessage *) GetMsg(appwin_mp)) {
  207.     args = awmsg->am_ArgList;
  208.     for (i = 0; i < awmsg->am_NumArgs; i++, args++)
  209.       loaddropped(args->wa_Name, args->wa_Lock);
  210.     ReplyMsg((struct Message *) awmsg);
  211.   }
  212. }
  213.  
  214.  
  215. /*
  216.  * Handle AppIcon events.
  217.  */
  218.  
  219. static void handleAppIcon(void)
  220. {
  221.   struct AppMessage *aimsg;
  222.   struct WBArg *args;
  223.   long i;
  224.  
  225.   while (aimsg = (struct AppMessage *) GetMsg(appicon_mp)) {
  226.     args = aimsg->am_ArgList;
  227.  
  228.     if (aimsg->am_NumArgs == 0) {
  229.       /*
  230.        * User double-clicked the AppIcon.
  231.        */
  232.       if (!opengui()) closegui();
  233.     }
  234.     else if (aimsg->am_NumArgs > 0)
  235.       for (i = 0; i < aimsg->am_NumArgs; i++, args++)
  236.     loaddropped(args->wa_Name, args->wa_Lock);
  237.     ReplyMsg((struct Message *) aimsg);
  238.   }
  239. }
  240.  
  241.  
  242. #define RXCMD_CREATEICONS (1)
  243. #define RXCMD_APPICON     (2)
  244. #define RXCMD_GETUNIT     (3)
  245. #define RXCMD_SETUNIT     (4)
  246. #define RXCMD_OPEN        (5)
  247. #define RXCMD_SAVEAS      (6)
  248. #define RXCMD_GETNUM      (7)
  249. #define RXCMD_GETCUR      (8)
  250. #define RXCMD_GETCI       (9)
  251.  
  252. static long rxcmd(long cmd, UBYTE *template, struct CSource *cs,
  253.           struct RexxMsg *rxmsg)
  254. {
  255.   struct MenuItem *mi;
  256.   struct RDArgs *rdargs;
  257.   UBYTE *arglist, sval[20], *s, *sptr, *valptr;
  258.   long val[3];
  259.   long result = 0;
  260.  
  261.   val[0] = val[1] = val[2] = 0;
  262.  
  263.   if (arglist = malloc(strlen(&cs->CS_Buffer[cs->CS_CurChr])+2)) {
  264.     strcpy(arglist, &cs->CS_Buffer[cs->CS_CurChr]);
  265.     strcat(arglist, "\n");    /* ReadArgs() needs this */
  266.  
  267.     if (rdargs = (struct RDArgs *) AllocDosObject(DOS_RDARGS, NULL)) {
  268.       rdargs->RDA_Source.CS_Buffer = arglist;
  269.       rdargs->RDA_Source.CS_Length = strlen(arglist);
  270.       rdargs->RDA_Flags = RDAF_NOPROMPT;
  271.  
  272.       if (ReadArgs(template, val, rdargs)) {
  273.     switch (cmd) {
  274.     case RXCMD_CREATEICONS:
  275.     case RXCMD_APPICON:
  276.       if (val[0] == val[1])
  277.         result = 20;        /* bogus combination! */
  278.       else if (val[0]) {        /* ON */
  279.         if (guiwin) {
  280.           ClearMenuStrip(guiwin);
  281.           mi = findmenuitem(ctmenustrip, (cmd == RXCMD_APPICON
  282.                           ? CTM_APPICON
  283.                           : CTM_ICONS));
  284.           mi->Flags |= CHECKED;
  285.           ResetMenuStrip(guiwin, ctmenustrip);
  286.         }
  287.         if (cmd == RXCMD_APPICON) {
  288.           usedropicon = TRUE;
  289.           if (!appicon) opendropicon();
  290.         }
  291.         else createicons = TRUE;
  292.       }
  293.       else {        /* OFF */
  294.         if (guiwin) {
  295.           ClearMenuStrip(guiwin);
  296.           mi = findmenuitem(ctmenustrip, (cmd == RXCMD_APPICON
  297.                           ? CTM_APPICON
  298.                           : CTM_ICONS));
  299.           mi->Flags &= ~CHECKED;
  300.           ResetMenuStrip(guiwin, ctmenustrip);
  301.         }
  302.         if (cmd == RXCMD_APPICON) {
  303.           usedropicon = FALSE;
  304.           closedropicon();
  305.         }
  306.         else createicons = FALSE;
  307.       }
  308.       break;
  309.     case RXCMD_GETUNIT:
  310.     case RXCMD_GETNUM:
  311.     case RXCMD_GETCUR:
  312.     case RXCMD_GETCI:
  313.       /* ARexx names must be uppercase */
  314.       valptr = (UBYTE *) val[0];
  315.       if (s = sptr = malloc(strlen(valptr) + 1)) {
  316.         for (; *valptr; *valptr++)
  317.           *sptr++ = toupper(*valptr);
  318.         *sptr = '\0';
  319.         if (cmd == RXCMD_GETCI) {
  320.           synchronizechecked();
  321.           if (createicons) 
  322.         SetRexxVar((struct Message *) rxmsg, s, "ON", 2L);
  323.           else
  324.         SetRexxVar((struct Message *) rxmsg, s, "OFF", 3L);
  325.         }
  326.         else {
  327.           if (cmd == RXCMD_GETCUR) sprintf(sval, "%ld", ncurrent);
  328.           else if (cmd == RXCMD_GETNUM) sprintf(sval, "%ld", ntotal);
  329.           else sprintf(sval, "%ld", unitnumber);
  330.           SetRexxVar((struct Message *) rxmsg, s, sval, strlen(sval));
  331.         }
  332.         free(s);
  333.       }
  334.       else result = 20;
  335.       break;
  336.     case RXCMD_SETUNIT:
  337.       if (*(long *)val[0] < 0 || *(long *)val[0] > 255) result = 20;
  338.       else unitnumber = *(long *)val[0];
  339.       break;
  340.     case RXCMD_OPEN:
  341.       s = (val[1] ? (UBYTE *) val[1] : (UBYTE *) ""); /* directory */
  342.       rxload((UBYTE *) val[0], s);
  343.       break;
  344.     case RXCMD_SAVEAS:
  345.       s = (val[2] ? (UBYTE *) val[2] : (UBYTE *) ""); /* directory */
  346.       rxsave((UBYTE *) val[0], s, (BOOL) val[1]);
  347.       break;
  348.     }
  349.     FreeArgs(rdargs);
  350.       }
  351.       else result = 20;
  352.       FreeDosObject(DOS_RDARGS, rdargs);
  353.     }
  354.     free(arglist);
  355.   }
  356.   else result = 20;
  357.   return result;
  358. }
  359.  
  360.  
  361. /*
  362.  * Handle requests from ARexx.
  363.  */
  364.  
  365. static BOOL handleARexx(void)
  366. {
  367.   struct RexxMsg *rxmsg;
  368.   struct CSource cs;
  369.   UBYTE buf[16];
  370.   BOOL killed = FALSE;
  371.   UBYTE *s;
  372.   long r1;
  373.  
  374.   while (!killed && (rxmsg = (struct RexxMsg *) GetMsg(arexx_mp))) {
  375.     if (CheckRexxMsg((struct Message *) rxmsg)) {
  376.       cs.CS_Buffer = rxmsg->rm_Args[0];
  377.       cs.CS_Length = strlen(cs.CS_Buffer);
  378.       cs.CS_CurChr = 0;
  379.       if (ReadItem(buf, 15L, &cs) == ITEM_ERROR)
  380.     r1 = 20;
  381.       else {
  382.     r1 = 0;
  383.     if (stricmp(buf, "QUIT") == 0) killed = TRUE;
  384.     else if (stricmp(buf, "CUT") == 0) cut();
  385.     else if (stricmp(buf, "COPY") == 0) copy();
  386.     else if (stricmp(buf, "PASTE") == 0) paste();
  387.     else if (stricmp(buf, "ERASE") == 0) freetext();
  388.     else if (stricmp(buf, "PREVIOUS") == 0) prevtext();
  389.     else if (stricmp(buf, "NEXT") == 0) nexttext();
  390.     else if (stricmp(buf, "SHOW") == 0 ||
  391.          stricmp(buf, "ACTIVATE") == 0) {
  392.       if (!opengui()) closegui();
  393.     }
  394.     else if (stricmp(buf, "HIDE") == 0 ||
  395.          stricmp(buf, "DEACTIVATE") == 0) closegui();
  396.     else if (stricmp(buf, "CREATEICONS") == 0)
  397.       r1 = rxcmd(RXCMD_CREATEICONS, "ON/S,OFF/S", &cs, rxmsg);
  398.     else if (stricmp(buf, "GETCREATEICONS") == 0)
  399.       r1 = rxcmd(RXCMD_GETCI, "VAR/K/A", &cs, rxmsg);
  400.     else if (stricmp(buf, "APPICON") == 0)
  401.       r1 = rxcmd(RXCMD_APPICON, "ON/S,OFF/S", &cs, rxmsg);
  402.     else if (stricmp(buf, "GETUNIT") == 0)
  403.       r1 = rxcmd(RXCMD_GETUNIT, "VAR/K/A", &cs, rxmsg);
  404.     else if (stricmp(buf, "SETUNIT") == 0)
  405.       r1 = rxcmd(RXCMD_SETUNIT, "/N/A", &cs, rxmsg);
  406.     else if (stricmp(buf, "GETNUMBER") == 0)
  407.       r1 = rxcmd(RXCMD_GETNUM, "VAR/K/A", &cs, rxmsg);
  408.     else if (stricmp(buf, "GETCURRENT") == 0)
  409.       r1 = rxcmd(RXCMD_GETCUR, "VAR/K/A", &cs, rxmsg);
  410.     else if (stricmp(buf, "OPEN") == 0)
  411.       r1 = rxcmd(RXCMD_OPEN, "NAME=FILENAME/K/A,DIR/K", &cs, rxmsg);
  412.     else if (stricmp(buf, "SAVEAS") == 0)
  413.       r1 = rxcmd(RXCMD_SAVEAS, "NAME/K/A,FTXT/S,DIR/K", &cs, rxmsg);
  414.     else r1 = 20;
  415.       }
  416.       rxmsg->rm_Result1 = r1;
  417.       rxmsg->rm_Result2 = (long) NULL;
  418.       if (rxmsg->rm_Action & RXFF_RESULT) {
  419.     if (s = CreateArgstring("0", 1L)) rxmsg->rm_Result2 = (long) s;
  420.     else rxmsg->rm_Result1 = 20;
  421.       }
  422.     }
  423.     ReplyMsg((struct Message *) rxmsg);
  424.   }
  425.   return killed;
  426. }
  427.